{
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "# Demo - age and gender recognition via REST API\n",
        "\n",
        "This notebook presents how to use OpenVINO Model Server to execute inference requests over REST API interface.\n",
        "The demo is using a pretrained model from [open_model_zoo](https://github.com/opencv/open_model_zoo) repository.\n",
        "\n",
        "### Download the pretrained model for age and gender recognition"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 1,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Cloning into \u0027open_model_zoo\u0027...\n",
            "remote: Enumerating objects: 307, done.\u001b[K\n",
            "remote: Counting objects: 100% (307/307), done.\u001b[K\n",
            "remote: Compressing objects: 100% (147/147), done.\u001b[K\n",
            "remote: Total 4080 (delta 127), reused 294 (delta 126), pack-reused 3773\u001b[K\n",
            "Receiving objects: 100% (4080/4080), 70.04 MiB | 2.53 MiB/s, done.\n",
            "Resolving deltas: 100% (2097/2097), done.\n",
            "Checking connectivity... done.\n"
          ]
        }
      ],
      "source": [
        "!git clone https://github.com/opencv/open_model_zoo.git"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 2,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "\n",
            "###############|| Downloading topologies ||###############\n",
            "\n",
            "\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Downloading /private/tmp/open_model_zoo/model_downloader/Retail/object_attributes/age_gender/dldt/age-gender-recognition-retail-0013.xml\n",
            "... 100%, 14 KB, 143 KB/s, 0 seconds passed\n",
            "\n",
            "\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d Downloading /private/tmp/open_model_zoo/model_downloader/Retail/object_attributes/age_gender/dldt/age-gender-recognition-retail-0013.bin\n",
            "... 100%, 8351 KB, 1571 KB/s, 5 seconds passed\n",
            "\n",
            "\n",
            "###############|| Post processing ||###############\n",
            "\n"
          ]
        }
      ],
      "source": [
        "!cd open_model_zoo/model_downloader; python downloader.py --name age-gender-recognition-retail-0013"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Build the docker image with OVMS component"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 3,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Cloning into \u0027OpenVINO-model-server\u0027...\n",
            "remote: Enumerating objects: 66, done.\u001b[K\n",
            "remote: Counting objects: 100% (66/66), done.\u001b[K\n",
            "remote: Compressing objects: 100% (51/51), done.\u001b[K\n",
            "remote: Total 1020 (delta 36), reused 33 (delta 15), pack-reused 954\u001b[K\n",
            "Receiving objects: 100% (1020/1020), 3.08 MiB | 1.99 MiB/s, done.\n",
            "Resolving deltas: 100% (613/613), done.\n",
            "Checking connectivity... done.\n"
          ]
        }
      ],
      "source": [
        "!git clone https://github.com/IntelAI/OpenVINO-model-server"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 4,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "Building docker image\n",
            "docker build -f Dockerfile_intelpython --build-arg http_proxy\u003d<http_proxy> --build-arg https_proxy\u003d<https_proxy> -t ie-serving-py:latest .\n",
            "Sending build context to Docker daemon   10.9MB\n",
            "Step 1/31 : FROM intelpython/intelpython3_core as DEV\n",
            " ---\u003e 3fbe3dacb980\n",
            "Step 2/31 : RUN apt-get update \u0026\u0026 apt-get install -y             autoconf             automake             build-essential             ca-certificates             curl             git             gstreamer1.0-plugins-base             libavcodec-dev             libavformat-dev             libboost-regex-dev             libcairo2-dev             libgfortran3             libglib2.0-dev             libgstreamer1.0-0             libgtk2.0-dev             libopenblas-dev             libpango1.0-dev             libpng-dev             libssl-dev             libswscale-dev             libtool             libusb-1.0-0-dev             pkg-config             unzip             vim             wget\n",
            " ---\u003e Using cache\n",
            " ---\u003e 8fd5609482f0\n",
            "Step 3/31 : RUN wget https://cmake.org/files/v3.14/cmake-3.14.3.tar.gz \u0026\u0026     tar -xvzf cmake-3.14.3.tar.gz \u0026\u0026     cd cmake-3.14.3/  \u0026\u0026     ./configure \u0026\u0026     make -j$(nproc) \u0026\u0026     make install\n",
            " ---\u003e Using cache\n",
            " ---\u003e 17d8dd74088f\n",
            "Step 4/31 : RUN echo \"deb http://ftp.us.debian.org/debian/ jessie main contrib non-free\" \u003e\u003e /etc/apt/sources.list \u0026\u0026     echo \"deb-src http://ftp.us.debian.org/debian/ jessie main contrib non-free\" \u003e\u003e /etc/apt/sources.list \u0026\u0026     apt update \u0026\u0026     apt-get install -y g++-4.9\n",
            " ---\u003e Using cache\n",
            " ---\u003e 6c8722580f8d\n",
            "Step 5/31 : ENV CXX /usr/bin/g++-4.9\n",
            " ---\u003e Using cache\n",
            " ---\u003e 58f5e723558e\n",
            "Step 6/31 : RUN pip install cython numpy\n",
            " ---\u003e Using cache\n",
            " ---\u003e 1473843d2d99\n",
            "Step 7/31 : ARG DLDT_DIR\u003d/dldt-2019_R1.0.1\n",
            " ---\u003e Using cache\n",
            " ---\u003e 7a017d89400c\n",
            "Step 8/31 : RUN git clone --depth\u003d1 -b 2019_R1.0.1 https://github.com/opencv/dldt.git ${DLDT_DIR} \u0026\u0026     cd ${DLDT_DIR} \u0026\u0026 git submodule init \u0026\u0026 git submodule update --recursive \u0026\u0026     rm -Rf .git \u0026\u0026 rm -Rf model-optimizer\n",
            " ---\u003e Using cache\n",
            " ---\u003e 63890a5041f7\n",
            "Step 9/31 : WORKDIR ${DLDT_DIR}\n",
            " ---\u003e Using cache\n",
            " ---\u003e 9f18c625432e\n",
            "Step 10/31 : RUN curl -L https://github.com/intel/mkl-dnn/releases/download/v0.18/mklml_lnx_2019.0.3.20190220.tgz | tar -xz\n",
            " ---\u003e Using cache\n",
            " ---\u003e d0e4f6bb10f1\n",
            "Step 11/31 : WORKDIR ${DLDT_DIR}/inference-engine/build\n",
            " ---\u003e Using cache\n",
            " ---\u003e 4497496b9f21\n",
            "Step 12/31 : RUN cmake -DGEMM\u003dMKL  -DMKLROOT\u003d${DLDT_DIR}/mklml_lnx_2019.0.3.20190220 -DENABLE_MKL_DNN\u003dON -DTHREADING\u003dOMP -DCMAKE_BUILD_TYPE\u003dRelease ..\n",
            " ---\u003e Using cache\n",
            " ---\u003e 6a070ec6a27b\n",
            "Step 13/31 : RUN make -j$(nproc)\n",
            " ---\u003e Using cache\n",
            " ---\u003e 0e78a1947f6c\n",
            "Step 14/31 : WORKDIR ${DLDT_DIR}/inference-engine/ie_bridges/python/build\n",
            " ---\u003e Using cache\n",
            " ---\u003e 8ff4a81c1172\n",
            "Step 15/31 : RUN cmake -DInferenceEngine_DIR\u003d${DLDT_DIR}/inference-engine/build -DPYTHON_EXECUTABLE\u003d$(which python) -DPYTHON_LIBRARY\u003d/opt/conda/lib/libpython3.6m.so -DPYTHON_INCLUDE_DIR\u003d/opt/conda/include/python3.6m ${DLDT_DIR}/inference-engine/ie_bridges/python \u0026\u0026     make -j$(nproc)\n",
            " ---\u003e Using cache\n",
            " ---\u003e 34c03c3cfcbb\n",
            "Step 16/31 : FROM intelpython/intelpython3_core as PROD\n",
            " ---\u003e 3fbe3dacb980\n",
            "Step 17/31 : RUN apt-get update \u0026\u0026 apt-get install -y --no-install-recommends             ca-certificates             curl             vim\n",
            " ---\u003e Using cache\n",
            " ---\u003e 793823310492\n",
            "Step 18/31 : COPY --from\u003dDEV /dldt-2019_R1.0.1/inference-engine/bin/intel64/Release/lib/*.so /usr/local/lib/\n",
            " ---\u003e Using cache\n",
            " ---\u003e c3e7715b9e18\n",
            "Step 19/31 : COPY --from\u003dDEV /dldt-2019_R1.0.1/inference-engine/ie_bridges/python/bin/intel64/Release/python_api/python3.6/openvino/ /usr/local/lib/openvino/\n",
            " ---\u003e Using cache\n",
            " ---\u003e 012f22f9d91c\n",
            "Step 20/31 : COPY --from\u003dDEV /dldt-2019_R1.0.1/mklml_lnx_2019.0.3.20190220/lib/lib*.so /usr/local/lib/\n",
            " ---\u003e Using cache\n",
            " ---\u003e 68efec8a74c2\n",
            "Step 21/31 : ENV LD_LIBRARY_PATH /usr/local/lib\n",
            " ---\u003e Using cache\n",
            " ---\u003e 33ac517dc744\n",
            "Step 22/31 : ENV PYTHONPATH /usr/local/lib\n",
            " ---\u003e Using cache\n",
            " ---\u003e 946f5854ade3\n",
            "Step 23/31 : COPY requirements.txt /ie-serving-py/\n",
            " ---\u003e Using cache\n",
            " ---\u003e 74798578c45b\n",
            "Step 24/31 : RUN conda create --name myenv -y\n",
            " ---\u003e Using cache\n",
            " ---\u003e 65763d64774e\n",
            "Step 25/31 : ENV PATH /opt/conda/envs/myenv/bin:$PATH\n",
            " ---\u003e Using cache\n",
            " ---\u003e f7983e390b75\n",
            "Step 26/31 : WORKDIR /ie-serving-py\n",
            " ---\u003e Using cache\n",
            " ---\u003e 770ab9194043\n",
            "Step 27/31 : RUN pip --no-cache-dir install -r requirements.txt\n",
            " ---\u003e Using cache\n",
            " ---\u003e 3113445a21ab\n",
            "Step 28/31 : COPY start_server.sh setup.py version /ie-serving-py/\n",
            " ---\u003e Using cache\n",
            " ---\u003e 50d9b215a283\n",
            "Step 29/31 : RUN sed -i \u0027/activate/d\u0027 start_server.sh\n",
            " ---\u003e Using cache\n",
            " ---\u003e 799c1833e9a5\n",
            "Step 30/31 : COPY ie_serving /ie-serving-py/ie_serving\n",
            " ---\u003e Using cache\n",
            " ---\u003e c104c09d982e\n",
            "Step 31/31 : RUN pip install .\n",
            " ---\u003e Using cache\n",
            " ---\u003e eeef45b475a9\n",
            "Successfully built eeef45b475a9\n",
            "Successfully tagged ie-serving-py:latest\n"
          ]
        }
      ],
      "source": [
        "!cd OpenVINO-model-server ; make docker_build_src_intelpython"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Start OVMS docker container with downloaded model"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 5,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "281614d378c9811c7b83092b1cb8db8763e7a7857dd0029b6f30f9e5bf539b51\r\n"
          ]
        }
      ],
      "source": "!export DOCKER_IMAGE_NAME\u003die-serving-py;\\\ndocker run -d --rm -v ${PWD}/open_model_zoo/model_downloader/Retail/object_attributes/age_gender/dldt:/opt/ml/age_gender/1 -p 9000:9000 -p 8000:8000 ${DOCKER_IMAGE_NAME} /ie-serving-py/start_server.sh ie_serving model --model_path /opt/ml/age_gender --model_name age_gender --port 9000 --rest_port 8000"
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Download sample image"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 6,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "--2019-06-28 14:39:50--  https://raw.githubusercontent.com/opencv/open_model_zoo/master/intel_models/age-gender-recognition-retail-0013/description/age-gender-recognition-retail-0001.jpg\n",
            "Resolving proxy-chain.intel.com... 163.33.7.140\n",
            "Connecting to proxy-chain.intel.com|163.33.7.140|:912... connected.\n",
            "Proxy request sent, awaiting response... 200 OK\n",
            "Length: 2436 (2.4K) [image/jpeg]\n",
            "Saving to: \u0027age-gender-recognition-retail-0001.jpg\u0027\n",
            "\n",
            "age-gender-recognit 100%[\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003e]   2.38K  --.-KB/s    in 0s      \n",
            "\n",
            "2019-06-28 14:39:50 (17.9 MB/s) - \u0027age-gender-recognition-retail-0001.jpg\u0027 saved [2436/2436]\n",
            "\n"
          ]
        }
      ],
      "source": [
        "!wget https://raw.githubusercontent.com/opencv/open_model_zoo/master/intel_models/age-gender-recognition-retail-0013/description/age-gender-recognition-retail-0001.jpg"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "![age-gender-recognition-retail-0001.jpg](age-gender-recognition-retail-0001.jpg)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Format the json request"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 7,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "age-gender-recognition-retail-0001.jpg (1, 3, 62, 62) ; data range: 0 : 239\n",
            "{\"inputs\": [[[[232, 226, 234, 232, 228, 231, 221, 198, 174, 115, 89, 73, 65, 57, 56, 58, 53, 49, 45, 42, 41, 31, 27, 24, 32, 42, 51, 53, 43, 42, 34, 38, 33, 30, 26, 23, 24, 24, 25, 23, 25, 26, 25, 24, 21, 21, 21, 21, 24, 19, 26, 24, 35, 40, 56, 63, 90, 127, 214, 197, 205, 195], [226, 233, 234, 229, 230, 228, 208, 187, 135, 82, 66, 49, 43, 65, 56, 60, 52, 48, 41, 37, 34, 31, 26, 28, 37, 43, 53, 50, 44, 37, 32, 32, 29, 28, 25, 22, 23, 23, 25, 25, 25, 26, 24, 23, 21, 20, 20, 20, 20, 19, 25, 26, 27, 31, 44, 59, 81, 151, 207, 200, 199, 196], [230, 229, 234, 234, 222, 215, 184, 122, 85, 64, 49, 56, 61, 62, 55, 48, 52, 47, 39, 33, 26, 27, 22, 28, 44, 47, 59, 41, 44, 33, 35, 27, 27, 26, 24, 22, 21, 21, 22, 23, 22, 23, 23, 22, 22, 23, 21, 21, 20, 21, 21, 26, 21, 25, 35, 60, 94, 170, 204, 195, 196, 195], [233, 231, 227, 226, 215, 162, 136, 77, 59, 66, 60, 57, 60, 52, 55, 52, 44, 37, 35, 30, 25, 27, 25, 37, 51, 44, 37, 44, 33, 27, 20, 29, 25, 24, 23, 22, 21, 21, 21, 22, 24, 24, 23, 22, 22, 22, 20, 20, 20, 21, 18, 23, 21, 25, 28, 48, 150, 183, 202, 188, 201, 194], [229, 228, 232, 217, 179, 158, 102, 71, 60, 60, 57, 57, 52, 41, 48, 41, 39, 31, 33, 28, 25, 24, 29, 46, 55, 49, 41, 35, 33, 30, 28, 25, 26, 25, 24, 24, 22, 22, 21, 21, 24, 23, 24, 22, 21, 21, 21, 19, 18, 19, 19, 23, 25, 22, 19, 29, 101, 136, 140, 140, 151, 192], [232, 233, 228, 195, 166, 108, 69, 56, 54, 59, 43, 54, 61, 44, 32, 34, 37, 28, 29, 23, 24, 22, 32, 48, 50, 43, 32, 36, 31, 29, 24, 24, 24, 22, 21, 23, 22, 21, 20, 20, 21, 21, 22, 21, 22, 23, 23, 23, 20, 20, 23, 21, 24, 22, 21, 25, 44, 56, 75, 89, 160, 185], [230, 228, 229, 183, 139, 79, 63, 61, 57, 49, 60, 52, 36, 48, 47, 43, 35, 30, 25, 24, 27, 29, 41, 53, 44, 43, 39, 30, 33, 28, 31, 22, 23, 22, 21, 22, 21, 20, 18, 19, 19, 19, 20, 21, 24, 25, 27, 24, 23, 20, 24, 21, 25, 23, 25, 27, 31, 48, 73, 78, 143, 180], [233, 228, 223, 179, 153, 77, 46, 62, 56, 60, 60, 54, 50, 41, 44, 34, 33, 32, 25, 24, 25, 31, 41, 49, 46, 42, 35, 36, 31, 26, 24, 24, 24, 23, 22, 23, 21, 20, 19, 21, 22, 22, 23, 23, 26, 25, 25, 21, 24, 17, 22, 24, 26, 25, 20, 20, 29, 31, 37, 48, 95, 182], [232, 231, 221, 191, 110, 51, 55, 55, 56, 52, 56, 53, 49, 44, 41, 41, 35, 26, 26, 20, 28, 30, 44, 52, 46, 38, 35, 32, 23, 31, 20, 22, 27, 22, 21, 21, 21, 20, 20, 20, 20, 24, 27, 27, 27, 25, 25, 23, 24, 21, 24, 22, 25, 22, 22, 22, 22, 24, 35, 52, 62, 172], [229, 232, 223, 174, 121, 71, 55, 47, 58, 58, 55, 54, 53, 40, 43, 34, 27, 28, 23, 27, 27, 36, 44, 57, 44, 38, 35, 29, 24, 28, 19, 21, 23, 21, 21, 21, 19, 19, 20, 21, 22, 23, 24, 23, 24, 24, 25, 24, 24, 21, 24, 22, 24, 21, 21, 21, 20, 23, 35, 49, 80, 152], [230, 227, 217, 164, 87, 64, 55, 65, 53, 51, 57, 48, 46, 37, 37, 35, 23, 25, 29, 35, 44, 53, 61, 68, 53, 35, 38, 38, 27, 29, 28, 20, 21, 19, 19, 19, 18, 19, 23, 24, 28, 28, 24, 21, 21, 21, 19, 19, 24, 23, 24, 21, 21, 18, 19, 19, 25, 17, 31, 55, 89, 119], [228, 224, 226, 142, 83, 60, 61, 53, 60, 57, 62, 48, 43, 39, 33, 31, 24, 28, 40, 56, 72, 82, 81, 76, 64, 39, 43, 51, 42, 40, 36, 27, 23, 20, 20, 20, 20, 22, 24, 21, 23, 24, 22, 20, 20, 20, 19, 20, 24, 24, 25, 20, 20, 17, 19, 18, 18, 24, 30, 38, 60, 113], [204, 198, 195, 115, 116, 68, 62, 57, 55, 56, 47, 44, 39, 37, 33, 26, 27, 44, 58, 81, 87, 98, 87, 79, 69, 56, 47, 48, 55, 51, 39, 34, 28, 22, 19, 18, 20, 21, 22, 19, 21, 23, 23, 21, 19, 19, 17, 21, 24, 26, 24, 19, 19, 16, 19, 19, 23, 22, 23, 40, 37, 66], [227, 228, 218, 131, 94, 63, 69, 57, 60, 55, 45, 42, 36, 34, 24, 28, 46, 68, 91, 105, 106, 105, 98, 94, 84, 81, 67, 59, 63, 64, 51, 40, 29, 23, 19, 19, 18, 17, 20, 21, 22, 24, 23, 20, 18, 18, 17, 19, 25, 26, 24, 18, 18, 17, 20, 20, 21, 26, 25, 37, 35, 50], [228, 227, 188, 101, 92, 65, 56, 55, 54, 40, 40, 35, 30, 31, 25, 46, 64, 84, 111, 111, 113, 103, 104, 98, 91, 88, 79, 73, 64, 66, 58, 45, 38, 31, 23, 21, 19, 18, 20, 24, 21, 23, 22, 20, 19, 20, 19, 21, 24, 25, 24, 18, 16, 15, 18, 18, 15, 23, 25, 27, 31, 44], [201, 210, 172, 86, 78, 66, 63, 62, 57, 43, 34, 33, 34, 27, 36, 58, 80, 98, 118, 120, 117, 115, 109, 101, 93, 98, 89, 87, 76, 73, 63, 64, 53, 41, 29, 26, 25, 21, 21, 20, 23, 25, 24, 20, 20, 20, 18, 19, 20, 24, 23, 18, 16, 15, 19, 18, 17, 20, 21, 24, 27, 37], [155, 151, 180, 81, 84, 70, 67, 49, 43, 33, 39, 35, 34, 31, 33, 60, 87, 109, 117, 123, 119, 115, 114, 110, 104, 99, 89, 88, 83, 73, 67, 60, 60, 53, 40, 34, 32, 29, 24, 19, 24, 24, 18, 18, 18, 16, 21, 20, 19, 22, 22, 19, 18, 18, 19, 17, 19, 20, 21, 21, 24, 28], [213, 209, 220, 95, 76, 74, 51, 40, 34, 35, 33, 34, 37, 38, 27, 77, 99, 115, 119, 121, 119, 115, 114, 111, 106, 101, 96, 86, 76, 64, 65, 63, 58, 59, 52, 52, 55, 52, 42, 31, 17, 19, 17, 17, 18, 17, 22, 23, 20, 21, 21, 19, 17, 17, 17, 15, 20, 21, 21, 22, 26, 32], [177, 211, 215, 77, 71, 55, 42, 28, 33, 29, 27, 28, 26, 36, 29, 87, 106, 118, 119, 118, 117, 114, 110, 106, 104, 97, 90, 81, 74, 68, 63, 59, 58, 48, 45, 56, 62, 54, 52, 53, 30, 24, 18, 17, 19, 20, 21, 23, 21, 21, 21, 20, 19, 18, 17, 16, 19, 19, 19, 20, 26, 32], [231, 204, 151, 82, 72, 58, 36, 33, 30, 27, 33, 30, 19, 39, 55, 104, 114, 121, 121, 120, 120, 116, 111, 106, 100, 95, 89, 85, 73, 72, 64, 64, 59, 59, 58, 55, 57, 54, 52, 46, 44, 30, 23, 16, 20, 22, 21, 23, 22, 20, 20, 20, 20, 19, 19, 19, 22, 22, 21, 22, 26, 32], [227, 225, 209, 77, 66, 49, 43, 36, 32, 29, 26, 25, 24, 60, 84, 110, 123, 125, 125, 124, 123, 116, 111, 104, 99, 94, 92, 85, 76, 76, 68, 67, 63, 61, 58, 55, 59, 55, 54, 45, 40, 33, 30, 22, 21, 20, 19, 24, 20, 19, 18, 19, 19, 19, 19, 20, 20, 20, 20, 20, 21, 23], [233, 220, 215, 96, 51, 47, 38, 36, 31, 29, 27, 23, 17, 68, 106, 121, 134, 133, 130, 126, 122, 116, 110, 104, 100, 92, 91, 82, 85, 78, 77, 69, 62, 58, 54, 49, 58, 58, 57, 44, 42, 36, 32, 25, 20, 19, 19, 21, 18, 18, 18, 18, 18, 18, 19, 20, 19, 21, 23, 24, 23, 22], [230, 217, 208, 95, 63, 45, 44, 37, 35, 26, 26, 20, 36, 95, 126, 129, 139, 135, 134, 126, 123, 117, 112, 107, 95, 92, 91, 84, 86, 80, 79, 73, 66, 46, 29, 22, 27, 24, 35, 41, 39, 37, 32, 27, 24, 21, 21, 18, 17, 18, 19, 18, 18, 20, 20, 20, 17, 19, 21, 22, 23, 22], [230, 228, 217, 130, 63, 52, 40, 38, 34, 29, 31, 19, 72, 122, 130, 132, 136, 131, 129, 124, 123, 115, 109, 103, 94, 87, 75, 81, 82, 84, 72, 59, 25, 23, 20, 12, 21, 21, 28, 22, 22, 30, 31, 30, 28, 22, 25, 20, 15, 18, 20, 19, 19, 20, 21, 20, 22, 22, 22, 22, 23, 24], [227, 225, 219, 142, 73, 49, 44, 37, 34, 35, 32, 27, 87, 133, 118, 52, 63, 66, 75, 104, 108, 108, 105, 99, 94, 87, 77, 79, 76, 64, 35, 16, 16, 23, 22, 46, 56, 55, 53, 43, 35, 29, 31, 30, 35, 27, 27, 23, 16, 17, 18, 20, 22, 20, 18, 20, 20, 21, 22, 21, 21, 22], [225, 226, 226, 179, 106, 46, 44, 35, 34, 32, 31, 19, 104, 108, 63, 57, 28, 31, 28, 30, 48, 86, 86, 91, 82, 83, 79, 72, 60, 30, 12, 18, 21, 37, 46, 49, 55, 53, 46, 45, 43, 38, 34, 34, 32, 31, 26, 23, 17, 18, 17, 18, 19, 19, 19, 21, 19, 21, 22, 21, 20, 20], [228, 232, 219, 184, 73, 96, 42, 40, 32, 27, 29, 22, 76, 55, 69, 75, 80, 61, 36, 25, 24, 36, 82, 87, 84, 80, 76, 64, 43, 23, 25, 32, 39, 33, 35, 31, 23, 28, 33, 39, 42, 42, 40, 38, 33, 35, 30, 24, 19, 19, 21, 22, 21, 20, 19, 20, 19, 21, 22, 21, 20, 21], [226, 227, 229, 201, 77, 100, 46, 42, 35, 34, 26, 17, 59, 119, 128, 111, 93, 76, 61, 53, 50, 54, 76, 92, 89, 88, 70, 56, 38, 29, 31, 32, 38, 19, 30, 17, 17, 25, 23, 31, 36, 43, 46, 43, 33, 33, 31, 27, 22, 23, 24, 25, 23, 21, 20, 20, 19, 20, 22, 22, 23, 24], [229, 226, 218, 208, 107, 110, 51, 34, 67, 33, 31, 18, 78, 133, 112, 74, 49, 44, 31, 23, 24, 32, 50, 90, 110, 87, 76, 57, 29, 24, 39, 27, 47, 66, 22, 13, 29, 44, 26, 22, 39, 45, 50, 43, 36, 32, 31, 24, 26, 24, 25, 24, 20, 20, 22, 22, 20, 20, 21, 23, 24, 24], [234, 232, 223, 200, 155, 81, 82, 36, 31, 33, 34, 23, 92, 138, 99, 30, 5, 40, 29, 47, 17, 13, 36, 62, 126, 102, 76, 46, 32, 27, 43, 30, 82, 94, 20, 25, 41, 38, 25, 39, 48, 48, 48, 40, 37, 32, 31, 24, 25, 24, 26, 26, 22, 23, 24, 21, 21, 20, 21, 22, 22, 21], [233, 223, 226, 199, 185, 111, 36, 50, 40, 36, 43, 24, 93, 133, 99, 15, 88, 123, 48, 24, 26, 49, 30, 68, 131, 102, 67, 44, 32, 33, 46, 33, 71, 73, 65, 38, 45, 38, 40, 53, 55, 51, 45, 39, 37, 34, 33, 29, 24, 24, 29, 30, 26, 26, 25, 19, 20, 20, 21, 22, 21, 19], [235, 237, 227, 205, 196, 133, 83, 36, 61, 62, 31, 36, 107, 146, 136, 127, 70, 75, 82, 37, 34, 40, 65, 89, 129, 107, 60, 49, 34, 34, 45, 65, 63, 60, 55, 56, 45, 36, 56, 61, 60, 55, 49, 45, 36, 35, 31, 32, 24, 25, 29, 30, 26, 26, 26, 20, 19, 20, 22, 21, 19, 16], [216, 211, 215, 185, 175, 184, 52, 96, 61, 74, 52, 33, 115, 147, 135, 127, 113, 86, 69, 61, 49, 61, 88, 102, 134, 103, 62, 49, 36, 38, 42, 57, 68, 57, 61, 54, 58, 65, 66, 64, 58, 54, 47, 44, 40, 35, 29, 29, 26, 20, 25, 25, 31, 33, 22, 18, 17, 21, 20, 26, 20, 26], [232, 228, 224, 227, 205, 187, 92, 127, 63, 40, 41, 43, 119, 149, 139, 115, 105, 91, 76, 76, 80, 90, 105, 130, 135, 102, 70, 45, 36, 39, 47, 58, 63, 66, 60, 75, 69, 68, 66, 63, 57, 54, 49, 46, 40, 36, 30, 29, 24, 24, 33, 29, 38, 29, 14, 19, 17, 17, 17, 50, 20, 72], [231, 228, 207, 201, 188, 196, 107, 83, 74, 46, 75, 36, 126, 150, 136, 124, 109, 105, 97, 95, 108, 121, 121, 137, 135, 95, 70, 38, 36, 39, 48, 51, 61, 66, 68, 73, 66, 68, 66, 62, 57, 55, 49, 45, 43, 39, 33, 31, 28, 33, 36, 35, 39, 22, 17, 20, 21, 12, 22, 86, 84, 101], [231, 230, 219, 196, 185, 198, 132, 81, 74, 68, 71, 40, 130, 147, 135, 124, 121, 114, 116, 120, 122, 128, 130, 146, 134, 91, 66, 40, 40, 39, 53, 56, 60, 67, 72, 74, 73, 71, 70, 63, 56, 54, 48, 45, 43, 41, 36, 33, 29, 25, 34, 33, 26, 18, 18, 17, 22, 15, 16, 74, 110, 90], [233, 228, 220, 213, 194, 189, 129, 63, 74, 74, 67, 83, 114, 149, 135, 135, 130, 123, 124, 124, 125, 130, 138, 144, 124, 83, 59, 48, 43, 36, 48, 54, 62, 69, 62, 78, 75, 66, 66, 56, 55, 52, 47, 43, 43, 43, 38, 34, 29, 24, 38, 34, 24, 29, 19, 24, 37, 28, 21, 93, 158, 180], [229, 224, 219, 213, 219, 172, 186, 72, 96, 79, 67, 49, 136, 159, 145, 142, 132, 129, 124, 120, 120, 117, 132, 130, 103, 68, 44, 49, 47, 38, 36, 36, 50, 62, 68, 72, 71, 65, 63, 57, 52, 49, 45, 43, 43, 43, 41, 38, 28, 30, 22, 25, 24, 25, 20, 20, 25, 16, 49, 101, 175, 191], [229, 225, 227, 221, 210, 223, 145, 91, 124, 91, 65, 87, 166, 159, 142, 131, 130, 125, 122, 117, 103, 90, 135, 136, 97, 65, 39, 46, 51, 54, 41, 31, 19, 36, 63, 61, 65, 63, 55, 53, 49, 45, 43, 43, 44, 43, 42, 40, 36, 37, 19, 26, 26, 22, 25, 20, 36, 43, 81, 143, 180, 200], [230, 227, 226, 224, 224, 217, 210, 123, 77, 99, 62, 51, 121, 151, 135, 128, 121, 117, 109, 88, 72, 91, 162, 136, 114, 81, 50, 41, 45, 63, 46, 35, 18, 36, 44, 61, 59, 60, 49, 49, 45, 41, 40, 41, 43, 42, 39, 40, 37, 27, 36, 34, 22, 19, 18, 21, 33, 41, 97, 175, 182, 164], [229, 227, 222, 227, 224, 215, 216, 156, 97, 106, 83, 44, 112, 143, 123, 118, 112, 105, 83, 63, 49, 147, 144, 124, 103, 66, 40, 43, 52, 45, 47, 29, 30, 34, 50, 63, 52, 50, 47, 40, 41, 40, 31, 37, 41, 43, 38, 38, 39, 21, 22, 18, 15, 18, 20, 23, 36, 26, 69, 136, 175, 119], [231, 225, 231, 225, 223, 221, 205, 191, 160, 67, 137, 56, 70, 150, 118, 110, 100, 91, 70, 50, 50, 116, 107, 100, 68, 49, 32, 36, 25, 25, 33, 24, 24, 37, 41, 50, 60, 54, 43, 38, 39, 41, 39, 44, 43, 41, 39, 38, 43, 14, 24, 19, 17, 20, 24, 21, 35, 52, 106, 144, 136, 163], [230, 227, 228, 228, 226, 219, 203, 208, 120, 86, 131, 107, 48, 141, 113, 110, 110, 83, 75, 65, 65, 90, 110, 93, 65, 50, 28, 25, 28, 36, 27, 35, 37, 40, 41, 49, 56, 56, 41, 31, 40, 40, 38, 46, 42, 36, 36, 38, 43, 19, 21, 18, 20, 15, 14, 17, 30, 35, 93, 122, 151, 102], [231, 232, 227, 228, 216, 206, 217, 225, 143, 152, 106, 158, 73, 150, 116, 109, 100, 94, 85, 62, 83, 110, 120, 122, 90, 65, 33, 32, 29, 28, 39, 40, 49, 44, 43, 40, 49, 63, 45, 31, 46, 43, 41, 50, 45, 40, 39, 39, 40, 26, 18, 19, 20, 13, 15, 20, 19, 32, 32, 57, 111, 130], [231, 227, 228, 224, 222, 221, 224, 219, 175, 184, 67, 168, 117, 119, 126, 114, 102, 109, 84, 58, 112, 119, 134, 123, 118, 89, 80, 69, 52, 51, 45, 48, 45, 31, 31, 30, 17, 39, 48, 30, 42, 40, 40, 50, 45, 40, 38, 36, 33, 20, 26, 21, 15, 16, 19, 12, 20, 24, 38, 52, 83, 113], [229, 232, 227, 218, 219, 224, 226, 227, 194, 165, 98, 114, 109, 83, 135, 118, 112, 116, 71, 69, 95, 119, 108, 95, 90, 84, 73, 65, 52, 40, 36, 30, 26, 33, 15, 6, 12, 40, 60, 41, 43, 45, 44, 51, 46, 41, 42, 43, 30, 23, 40, 25, 22, 20, 20, 19, 18, 20, 26, 23, 73, 115], [228, 232, 216, 220, 227, 228, 224, 220, 207, 162, 144, 99, 147, 69, 146, 122, 113, 116, 71, 28, 0, 0, 62, 54, 56, 54, 52, 50, 44, 22, 53, 38, 68, 35, 16, 25, 40, 48, 60, 48, 41, 46, 44, 46, 42, 40, 42, 47, 25, 22, 27, 36, 39, 24, 21, 31, 23, 19, 32, 35, 70, 149], [231, 227, 215, 224, 224, 227, 224, 226, 205, 143, 193, 103, 112, 81, 133, 125, 125, 120, 81, 34, 52, 12, 110, 130, 136, 150, 121, 118, 133, 58, 105, 67, 66, 37, 40, 31, 42, 53, 62, 52, 41, 47, 45, 49, 45, 42, 41, 43, 29, 23, 23, 84, 80, 43, 28, 24, 32, 44, 42, 92, 135, 164], [233, 220, 220, 229, 230, 225, 224, 223, 200, 164, 205, 74, 114, 89, 118, 134, 135, 121, 101, 65, 108, 86, 108, 150, 150, 166, 146, 148, 142, 79, 79, 46, 46, 40, 34, 32, 42, 53, 56, 48, 45, 44, 41, 43, 42, 44, 47, 38, 26, 22, 20, 33, 34, 83, 28, 76, 58, 42, 38, 125, 200, 198], [231, 221, 229, 225, 222, 223, 226, 217, 189, 161, 192, 85, 108, 130, 117, 155, 131, 129, 109, 95, 129, 128, 121, 105, 86, 113, 111, 86, 89, 57, 47, 44, 37, 36, 37, 36, 43, 46, 49, 44, 45, 43, 43, 44, 42, 43, 43, 34, 22, 20, 15, 18, 26, 32, 49, 63, 68, 124, 106, 143, 198, 183], [220, 223, 230, 227, 230, 222, 222, 219, 191, 172, 130, 113, 75, 119, 141, 122, 131, 125, 99, 104, 131, 145, 144, 129, 109, 87, 76, 80, 71, 75, 52, 42, 33, 34, 39, 39, 43, 44, 47, 44, 45, 41, 38, 39, 38, 43, 45, 41, 26, 14, 22, 20, 50, 40, 23, 66, 76, 140, 122, 131, 197, 203], [222, 227, 220, 226, 225, 221, 229, 199, 214, 134, 172, 135, 85, 166, 152, 79, 130, 122, 111, 107, 135, 144, 130, 106, 96, 96, 87, 85, 65, 50, 48, 42, 41, 39, 40, 40, 42, 41, 42, 39, 41, 41, 42, 43, 42, 41, 35, 30, 24, 28, 25, 28, 38, 44, 38, 68, 51, 103, 122, 125, 199, 199], [225, 217, 224, 216, 207, 199, 181, 199, 211, 211, 210, 95, 118, 191, 118, 89, 69, 135, 114, 108, 126, 141, 140, 121, 85, 83, 66, 57, 58, 48, 56, 49, 46, 41, 40, 39, 41, 41, 43, 41, 37, 37, 34, 35, 35, 40, 38, 39, 21, 30, 26, 40, 42, 21, 42, 45, 63, 66, 136, 136, 175, 180], [190, 189, 190, 195, 186, 189, 186, 188, 188, 185, 182, 84, 184, 144, 98, 89, 68, 108, 121, 120, 129, 136, 134, 109, 102, 73, 68, 70, 64, 60, 52, 45, 45, 44, 43, 39, 40, 41, 44, 42, 35, 38, 37, 41, 37, 40, 32, 32, 28, 27, 28, 23, 51, 54, 89, 109, 84, 33, 84, 166, 204, 203], [211, 216, 214, 223, 223, 218, 218, 226, 223, 210, 201, 91, 186, 144, 105, 80, 82, 57, 129, 123, 131, 135, 130, 107, 94, 81, 82, 66, 63, 54, 54, 54, 52, 49, 49, 40, 38, 36, 38, 34, 36, 38, 34, 38, 35, 40, 37, 44, 27, 24, 38, 23, 79, 106, 63, 143, 94, 93, 78, 155, 216, 210], [218, 221, 219, 220, 222, 223, 224, 224, 226, 210, 166, 131, 130, 98, 95, 86, 61, 100, 111, 130, 132, 142, 129, 124, 106, 104, 81, 82, 71, 65, 65, 52, 51, 49, 46, 37, 37, 38, 40, 35, 36, 38, 38, 39, 35, 40, 36, 43, 52, 55, 29, 27, 73, 110, 47, 91, 68, 98, 125, 141, 210, 211], [222, 220, 220, 224, 226, 224, 227, 229, 225, 227, 192, 194, 149, 138, 119, 70, 87, 120, 100, 126, 139, 146, 135, 127, 121, 111, 97, 85, 72, 64, 63, 59, 57, 48, 42, 37, 36, 33, 30, 38, 35, 33, 41, 36, 34, 38, 36, 35, 43, 47, 47, 22, 102, 96, 62, 75, 86, 130, 161, 135, 217, 211], [223, 221, 221, 223, 224, 223, 225, 228, 226, 221, 209, 145, 136, 169, 138, 72, 73, 109, 122, 141, 184, 142, 141, 135, 127, 112, 95, 83, 72, 65, 61, 57, 54, 46, 40, 35, 36, 34, 34, 38, 35, 33, 40, 37, 35, 39, 37, 37, 37, 72, 62, 89, 108, 54, 83, 80, 107, 162, 147, 141, 211, 213], [227, 226, 224, 223, 223, 223, 226, 226, 227, 220, 206, 150, 178, 172, 185, 102, 92, 97, 143, 133, 179, 169, 141, 134, 120, 106, 85, 76, 69, 65, 62, 52, 45, 41, 36, 32, 35, 35, 35, 37, 36, 33, 37, 36, 35, 36, 34, 37, 38, 26, 123, 93, 47, 37, 138, 75, 158, 173, 162, 154, 210, 206], [228, 227, 225, 223, 223, 225, 228, 227, 226, 220, 199, 202, 184, 181, 170, 120, 126, 114, 104, 113, 167, 200, 144, 125, 114, 99, 81, 68, 63, 62, 59, 43, 34, 35, 35, 33, 37, 36, 35, 36, 38, 35, 37, 37, 36, 35, 32, 36, 45, 92, 49, 96, 30, 78, 71, 146, 152, 148, 161, 139, 206, 193], [229, 230, 226, 223, 223, 227, 230, 229, 230, 221, 196, 215, 207, 209, 202, 117, 138, 115, 135, 134, 122, 201, 148, 125, 100, 78, 63, 55, 52, 55, 55, 46, 35, 40, 40, 38, 40, 38, 37, 35, 37, 37, 37, 37, 38, 34, 32, 37, 45, 55, 85, 105, 46, 77, 130, 124, 174, 174, 172, 146, 196, 208], [229, 230, 226, 223, 223, 226, 230, 229, 229, 223, 212, 218, 217, 212, 216, 114, 141, 147, 131, 141, 145, 165, 136, 137, 105, 71, 53, 48, 39, 37, 35, 37, 42, 48, 45, 42, 40, 36, 37, 36, 37, 39, 38, 38, 39, 35, 34, 39, 48, 87, 60, 49, 46, 164, 131, 141, 184, 178, 164, 140, 171, 215]], [[239, 233, 235, 232, 227, 229, 220, 198, 174, 116, 92, 77, 66, 60, 55, 58, 53, 50, 45, 42, 40, 30, 27, 24, 33, 43, 52, 54, 41, 40, 31, 36, 33, 31, 26, 23, 22, 22, 20, 18, 20, 21, 23, 22, 21, 21, 22, 22, 25, 20, 26, 24, 34, 41, 58, 69, 99, 139, 222, 204, 205, 193], [233, 237, 235, 229, 229, 226, 207, 187, 135, 83, 69, 51, 45, 68, 55, 60, 53, 49, 41, 37, 33, 30, 26, 28, 38, 44, 54, 51, 42, 35, 29, 30, 30, 29, 25, 22, 21, 21, 20, 20, 20, 21, 22, 21, 21, 20, 21, 21, 21, 20, 25, 26, 26, 32, 47, 65, 90, 160, 215, 207, 201, 194], [234, 233, 235, 234, 221, 213, 183, 123, 85, 66, 51, 58, 63, 65, 54, 48, 50, 45, 37, 31, 23, 24, 20, 26, 42, 45, 57, 39, 42, 31, 33, 25, 25, 24, 22, 20, 19, 19, 20, 21, 20, 21, 21, 20, 20, 21, 22, 22, 21, 22, 21, 26, 20, 26, 38, 64, 100, 180, 212, 202, 198, 196], [237, 235, 228, 226, 214, 160, 135, 76, 59, 68, 62, 59, 63, 53, 55, 53, 42, 35, 33, 28, 22, 24, 23, 35, 49, 42, 35, 42, 31, 25, 18, 27, 23, 22, 21, 20, 19, 19, 19, 20, 22, 22, 21, 20, 20, 20, 21, 21, 21, 22, 19, 23, 20, 24, 28, 51, 157, 191, 210, 195, 203, 195], [233, 232, 235, 219, 178, 156, 101, 70, 61, 61, 58, 59, 53, 40, 48, 39, 35, 28, 29, 23, 22, 21, 26, 44, 53, 47, 39, 33, 31, 28, 26, 23, 22, 21, 20, 20, 20, 20, 19, 19, 25, 24, 22, 20, 19, 19, 19, 20, 19, 20, 20, 21, 22, 21, 20, 32, 106, 141, 146, 145, 155, 194], [236, 237, 230, 197, 165, 106, 68, 55, 56, 61, 45, 54, 60, 44, 30, 32, 34, 25, 25, 21, 21, 19, 29, 47, 47, 41, 30, 34, 29, 27, 22, 22, 20, 18, 17, 19, 20, 19, 18, 18, 22, 22, 20, 19, 20, 21, 21, 21, 21, 21, 21, 19, 22, 19, 20, 26, 48, 61, 81, 94, 164, 189], [234, 232, 231, 185, 140, 79, 62, 60, 56, 49, 60, 53, 35, 48, 45, 41, 32, 27, 23, 22, 24, 28, 40, 55, 43, 43, 39, 30, 33, 28, 29, 20, 19, 17, 18, 19, 20, 19, 19, 20, 20, 20, 21, 22, 22, 23, 22, 22, 24, 21, 22, 19, 20, 21, 22, 26, 33, 52, 78, 83, 149, 186], [237, 231, 225, 181, 153, 77, 45, 61, 56, 60, 61, 56, 50, 41, 42, 32, 32, 31, 23, 24, 24, 32, 41, 52, 49, 46, 37, 38, 33, 26, 24, 22, 20, 20, 19, 20, 20, 19, 20, 22, 23, 23, 24, 24, 24, 23, 20, 19, 23, 18, 20, 22, 21, 20, 17, 17, 28, 33, 39, 53, 100, 188], [235, 234, 223, 193, 113, 53, 57, 57, 56, 52, 55, 52, 47, 42, 39, 39, 33, 27, 25, 21, 31, 34, 47, 55, 49, 42, 38, 35, 26, 33, 22, 22, 23, 18, 17, 19, 19, 18, 21, 21, 21, 25, 25, 25, 25, 23, 21, 21, 23, 22, 22, 20, 21, 18, 20, 20, 22, 26, 37, 54, 67, 177], [232, 234, 225, 177, 123, 73, 57, 49, 58, 59, 54, 53, 51, 38, 41, 34, 29, 30, 26, 30, 29, 40, 50, 63, 50, 45, 40, 35, 28, 32, 22, 23, 21, 19, 19, 19, 17, 17, 21, 22, 23, 24, 22, 21, 22, 22, 21, 22, 22, 22, 22, 20, 20, 17, 19, 19, 20, 23, 37, 51, 85, 157], [232, 229, 221, 167, 89, 66, 57, 67, 53, 52, 56, 48, 46, 37, 36, 37, 26, 29, 34, 41, 49, 60, 69, 76, 61, 44, 46, 47, 34, 34, 31, 23, 20, 19, 19, 19, 19, 20, 21, 22, 26, 26, 22, 19, 19, 19, 17, 17, 22, 21, 22, 19, 19, 16, 17, 17, 23, 17, 33, 57, 93, 123], [230, 226, 229, 145, 85, 62, 63, 56, 63, 58, 61, 48, 43, 38, 32, 34, 29, 34, 47, 64, 81, 90, 91, 86, 75, 50, 53, 59, 49, 46, 42, 32, 26, 22, 19, 20, 20, 23, 22, 19, 21, 22, 20, 18, 18, 18, 17, 18, 22, 22, 23, 18, 18, 15, 17, 16, 16, 22, 29, 40, 61, 116], [204, 200, 198, 118, 118, 72, 64, 59, 57, 57, 46, 43, 41, 39, 34, 29, 34, 51, 66, 91, 98, 108, 98, 92, 80, 68, 59, 59, 65, 59, 46, 40, 31, 25, 20, 20, 19, 21, 20, 17, 17, 19, 19, 17, 17, 17, 17, 19, 22, 22, 22, 17, 18, 15, 17, 17, 21, 20, 22, 42, 38, 66], [227, 230, 218, 134, 96, 67, 71, 59, 62, 58, 46, 44, 38, 37, 27, 33, 53, 78, 102, 116, 116, 117, 111, 107, 98, 94, 78, 70, 73, 72, 58, 47, 34, 28, 22, 20, 17, 16, 18, 19, 18, 20, 19, 16, 16, 16, 17, 19, 21, 22, 22, 16, 17, 16, 18, 18, 19, 24, 24, 36, 35, 50], [227, 229, 188, 104, 94, 68, 60, 57, 56, 43, 41, 37, 31, 34, 28, 52, 72, 96, 124, 126, 126, 118, 118, 112, 106, 104, 94, 87, 75, 75, 65, 52, 44, 35, 27, 24, 21, 17, 18, 19, 16, 18, 18, 16, 17, 18, 19, 21, 20, 21, 22, 16, 17, 16, 19, 19, 15, 23, 24, 26, 31, 43], [200, 211, 174, 88, 81, 72, 67, 64, 60, 44, 33, 35, 35, 31, 38, 65, 91, 113, 133, 136, 132, 130, 123, 115, 107, 113, 105, 102, 89, 84, 72, 70, 60, 45, 34, 29, 25, 20, 18, 18, 18, 21, 20, 18, 18, 18, 16, 17, 18, 20, 21, 16, 17, 16, 20, 19, 18, 20, 20, 23, 25, 37], [157, 155, 185, 87, 91, 78, 73, 52, 44, 30, 34, 33, 35, 33, 37, 67, 100, 128, 136, 143, 138, 133, 126, 122, 116, 111, 104, 104, 98, 87, 78, 67, 66, 58, 44, 37, 32, 28, 25, 18, 22, 22, 16, 16, 16, 14, 19, 18, 17, 20, 20, 17, 16, 16, 17, 15, 17, 18, 19, 18, 21, 27], [216, 213, 224, 100, 83, 81, 58, 44, 33, 32, 28, 31, 37, 41, 33, 87, 114, 135, 139, 143, 139, 134, 127, 122, 116, 113, 110, 103, 92, 79, 75, 71, 64, 63, 56, 56, 55, 53, 44, 32, 19, 19, 17, 18, 16, 15, 19, 20, 18, 19, 19, 17, 15, 15, 15, 13, 18, 19, 19, 20, 24, 30], [178, 213, 217, 83, 78, 63, 49, 32, 34, 28, 24, 29, 29, 43, 38, 97, 122, 137, 138, 140, 137, 133, 126, 119, 116, 109, 104, 97, 89, 81, 73, 68, 66, 56, 52, 63, 66, 58, 54, 56, 33, 26, 20, 17, 17, 18, 18, 20, 19, 19, 19, 18, 17, 16, 15, 14, 17, 17, 17, 18, 24, 30], [232, 206, 154, 85, 78, 64, 41, 37, 31, 26, 32, 33, 25, 49, 66, 118, 129, 138, 140, 142, 140, 135, 127, 119, 112, 110, 105, 101, 87, 84, 73, 72, 68, 70, 67, 63, 64, 60, 57, 49, 47, 33, 24, 18, 18, 20, 17, 20, 20, 18, 18, 18, 18, 17, 17, 17, 20, 20, 19, 20, 24, 30], [229, 228, 212, 79, 70, 53, 46, 39, 33, 28, 26, 27, 31, 73, 99, 127, 138, 142, 144, 143, 142, 135, 127, 120, 114, 108, 108, 101, 90, 85, 76, 74, 74, 72, 67, 63, 65, 60, 58, 50, 43, 36, 31, 24, 19, 18, 15, 20, 18, 17, 16, 17, 17, 17, 17, 18, 18, 18, 18, 18, 19, 21], [235, 221, 216, 98, 53, 49, 40, 36, 30, 30, 29, 27, 25, 81, 122, 140, 148, 148, 148, 145, 141, 132, 126, 119, 114, 105, 107, 96, 97, 88, 83, 77, 71, 69, 64, 58, 65, 63, 60, 48, 44, 39, 35, 26, 19, 17, 14, 17, 16, 16, 16, 16, 16, 16, 17, 18, 17, 19, 21, 22, 21, 20], [231, 218, 210, 98, 64, 46, 46, 37, 34, 27, 28, 26, 46, 110, 145, 148, 154, 147, 148, 143, 140, 131, 124, 119, 108, 105, 104, 98, 97, 89, 87, 80, 74, 54, 36, 28, 34, 30, 39, 43, 41, 40, 35, 28, 23, 19, 16, 13, 15, 16, 17, 16, 16, 18, 18, 18, 15, 17, 19, 20, 21, 20], [231, 229, 219, 131, 65, 54, 40, 38, 33, 30, 34, 25, 82, 135, 149, 150, 147, 140, 141, 137, 135, 127, 121, 114, 104, 100, 87, 94, 92, 93, 80, 65, 31, 29, 24, 17, 24, 25, 30, 24, 24, 32, 33, 33, 27, 21, 20, 15, 13, 16, 18, 17, 17, 18, 19, 18, 20, 20, 20, 20, 21, 22], [230, 228, 221, 143, 72, 48, 42, 35, 30, 34, 35, 34, 97, 147, 134, 69, 74, 75, 85, 114, 119, 117, 114, 109, 104, 98, 87, 89, 84, 71, 43, 23, 21, 26, 24, 48, 57, 56, 54, 44, 36, 30, 33, 33, 34, 26, 22, 18, 14, 15, 16, 18, 20, 18, 16, 18, 18, 19, 20, 19, 19, 20], [228, 229, 228, 180, 106, 45, 41, 33, 33, 31, 34, 26, 112, 121, 80, 71, 39, 38, 35, 37, 56, 95, 93, 99, 89, 92, 88, 82, 67, 37, 19, 23, 23, 39, 48, 48, 54, 52, 45, 47, 44, 39, 35, 36, 32, 30, 23, 18, 15, 16, 15, 16, 17, 17, 17, 19, 17, 19, 20, 19, 18, 18], [231, 235, 223, 187, 75, 97, 41, 39, 33, 28, 32, 28, 84, 68, 84, 90, 87, 67, 40, 29, 28, 43, 88, 95, 91, 89, 84, 72, 50, 30, 32, 36, 41, 33, 35, 28, 20, 27, 32, 40, 42, 44, 41, 40, 33, 34, 27, 21, 17, 17, 19, 20, 19, 18, 17, 18, 17, 19, 20, 19, 18, 19], [229, 230, 234, 204, 79, 101, 46, 43, 35, 37, 29, 23, 69, 132, 144, 125, 101, 81, 65, 57, 54, 59, 82, 100, 97, 95, 79, 63, 44, 37, 37, 37, 40, 19, 30, 16, 16, 24, 22, 31, 37, 45, 48, 44, 35, 33, 30, 24, 19, 21, 22, 23, 21, 19, 18, 18, 17, 18, 20, 20, 21, 22], [232, 229, 223, 211, 109, 110, 51, 36, 69, 36, 38, 26, 89, 147, 127, 88, 56, 48, 34, 28, 29, 39, 58, 99, 119, 97, 83, 64, 36, 30, 45, 31, 49, 68, 24, 14, 30, 46, 27, 25, 42, 48, 53, 45, 38, 32, 30, 23, 23, 21, 23, 22, 18, 18, 20, 20, 18, 18, 19, 21, 22, 22], [237, 235, 225, 204, 156, 82, 82, 37, 35, 40, 43, 34, 105, 151, 116, 44, 12, 45, 33, 50, 21, 20, 45, 72, 138, 113, 84, 52, 39, 32, 48, 36, 86, 98, 24, 29, 44, 41, 28, 43, 52, 52, 53, 43, 39, 34, 31, 23, 22, 21, 24, 24, 20, 21, 22, 19, 19, 18, 19, 20, 20, 19], [234, 227, 229, 203, 186, 112, 36, 53, 46, 45, 52, 36, 107, 147, 118, 31, 95, 129, 53, 28, 31, 58, 40, 80, 143, 115, 77, 51, 38, 37, 50, 37, 76, 79, 70, 43, 49, 45, 46, 59, 61, 57, 52, 44, 39, 36, 33, 28, 21, 21, 26, 27, 24, 24, 23, 17, 18, 18, 19, 20, 19, 17], [236, 238, 230, 209, 198, 136, 85, 40, 68, 71, 44, 50, 120, 163, 154, 144, 81, 83, 87, 44, 42, 51, 76, 103, 141, 121, 70, 56, 41, 40, 50, 69, 70, 67, 62, 62, 50, 43, 63, 68, 65, 61, 55, 50, 39, 37, 34, 33, 23, 22, 26, 27, 24, 24, 24, 18, 17, 18, 20, 21, 18, 16], [214, 211, 217, 188, 178, 188, 56, 102, 68, 83, 63, 47, 130, 164, 153, 145, 127, 99, 78, 70, 60, 73, 100, 116, 146, 114, 71, 58, 44, 45, 49, 64, 76, 67, 70, 63, 67, 74, 75, 71, 63, 58, 51, 48, 43, 37, 32, 32, 26, 19, 24, 24, 29, 31, 20, 16, 16, 20, 19, 28, 21, 28], [229, 227, 223, 230, 209, 194, 97, 134, 70, 51, 52, 57, 134, 168, 156, 134, 121, 106, 88, 86, 90, 102, 118, 142, 147, 112, 79, 53, 43, 46, 55, 68, 73, 75, 69, 85, 79, 78, 74, 69, 62, 56, 51, 47, 43, 38, 32, 32, 24, 25, 32, 28, 36, 27, 12, 17, 16, 19, 18, 51, 23, 75], [229, 228, 207, 205, 192, 203, 112, 90, 81, 57, 86, 50, 141, 168, 152, 142, 124, 117, 107, 105, 118, 133, 135, 150, 148, 106, 79, 45, 43, 46, 56, 60, 70, 76, 78, 85, 78, 77, 74, 69, 62, 57, 51, 46, 44, 40, 35, 31, 28, 32, 33, 32, 37, 20, 15, 18, 20, 14, 23, 89, 87, 104], [229, 230, 221, 200, 189, 205, 138, 89, 81, 79, 82, 54, 145, 165, 154, 141, 137, 128, 127, 131, 133, 141, 146, 161, 148, 101, 75, 47, 46, 46, 58, 62, 69, 76, 84, 85, 84, 82, 77, 70, 60, 56, 50, 45, 43, 40, 35, 32, 28, 24, 31, 31, 24, 16, 16, 17, 21, 17, 19, 77, 113, 93], [233, 228, 223, 218, 199, 197, 135, 71, 81, 85, 78, 97, 128, 167, 153, 153, 148, 139, 137, 137, 138, 146, 155, 160, 140, 96, 68, 56, 50, 41, 52, 61, 70, 80, 73, 88, 85, 77, 73, 63, 59, 54, 47, 43, 40, 40, 36, 33, 28, 23, 35, 32, 19, 25, 17, 24, 36, 30, 24, 96, 163, 185], [229, 225, 222, 218, 224, 178, 192, 79, 103, 88, 78, 63, 150, 176, 162, 159, 149, 145, 138, 134, 135, 133, 151, 149, 119, 81, 53, 57, 51, 43, 39, 41, 59, 71, 77, 82, 81, 74, 70, 64, 56, 51, 45, 41, 41, 40, 37, 34, 27, 29, 20, 23, 20, 21, 18, 20, 27, 20, 52, 104, 180, 196], [230, 226, 230, 226, 215, 229, 151, 98, 131, 100, 76, 101, 180, 176, 159, 148, 146, 140, 135, 130, 117, 106, 153, 154, 113, 78, 48, 51, 54, 58, 42, 34, 24, 43, 70, 70, 74, 72, 62, 60, 53, 47, 43, 41, 42, 40, 38, 36, 33, 35, 17, 24, 22, 18, 23, 20, 38, 47, 84, 148, 185, 205], [231, 228, 230, 229, 229, 222, 215, 129, 84, 109, 73, 65, 135, 167, 151, 144, 137, 132, 121, 100, 86, 106, 180, 155, 130, 94, 57, 46, 48, 64, 47, 37, 22, 41, 51, 69, 66, 68, 57, 57, 50, 44, 41, 41, 41, 38, 36, 36, 34, 25, 34, 32, 18, 17, 18, 23, 35, 45, 102, 180, 187, 169], [230, 228, 226, 232, 229, 220, 222, 162, 104, 113, 92, 56, 126, 159, 139, 134, 131, 121, 96, 75, 62, 163, 163, 143, 120, 80, 48, 45, 53, 45, 47, 30, 32, 36, 54, 69, 60, 58, 55, 49, 46, 45, 34, 37, 41, 42, 37, 36, 36, 19, 18, 14, 13, 16, 20, 25, 38, 29, 74, 143, 182, 126], [232, 226, 235, 229, 228, 226, 208, 195, 165, 75, 146, 68, 84, 167, 134, 126, 119, 110, 84, 63, 64, 131, 125, 119, 85, 62, 41, 39, 26, 26, 34, 27, 25, 40, 45, 55, 67, 63, 52, 48, 46, 46, 42, 46, 44, 42, 38, 38, 42, 12, 20, 15, 15, 18, 24, 23, 38, 57, 113, 151, 143, 170], [230, 228, 232, 232, 231, 224, 207, 213, 126, 93, 138, 118, 62, 158, 129, 127, 130, 103, 89, 79, 80, 106, 129, 113, 83, 64, 37, 29, 32, 40, 31, 39, 38, 40, 45, 53, 64, 64, 51, 42, 47, 46, 44, 49, 43, 38, 37, 38, 42, 17, 19, 16, 18, 13, 13, 19, 33, 39, 99, 128, 157, 108], [231, 232, 230, 231, 219, 210, 220, 228, 147, 160, 114, 169, 88, 168, 133, 127, 121, 114, 101, 76, 97, 126, 139, 141, 106, 77, 42, 37, 33, 33, 45, 44, 51, 45, 46, 46, 56, 72, 56, 42, 53, 50, 47, 53, 46, 42, 40, 39, 39, 24, 16, 17, 18, 13, 17, 23, 22, 36, 38, 63, 117, 136], [230, 227, 229, 227, 225, 226, 227, 222, 179, 190, 75, 179, 130, 134, 143, 134, 124, 131, 99, 72, 125, 133, 150, 140, 132, 99, 87, 73, 55, 55, 51, 53, 47, 33, 35, 35, 22, 49, 60, 42, 50, 47, 47, 53, 46, 41, 37, 36, 32, 20, 24, 19, 15, 16, 21, 15, 23, 27, 44, 58, 86, 116], [228, 232, 227, 219, 222, 226, 229, 229, 196, 171, 107, 126, 123, 99, 153, 138, 134, 138, 88, 83, 108, 133, 124, 111, 103, 93, 79, 70, 57, 46, 43, 36, 28, 36, 19, 11, 18, 50, 72, 53, 51, 52, 51, 54, 46, 42, 41, 43, 29, 23, 38, 23, 22, 19, 21, 22, 21, 23, 32, 29, 76, 118], [227, 232, 216, 221, 230, 230, 227, 222, 209, 166, 151, 109, 161, 85, 164, 143, 139, 141, 88, 42, 7, 7, 79, 71, 70, 66, 60, 55, 51, 30, 64, 46, 72, 38, 20, 32, 48, 58, 72, 60, 49, 53, 48, 49, 42, 39, 39, 45, 24, 21, 27, 36, 38, 23, 22, 34, 26, 22, 37, 40, 73, 152], [230, 227, 216, 225, 227, 232, 228, 230, 208, 147, 200, 113, 126, 97, 152, 144, 148, 142, 99, 49, 66, 27, 126, 147, 151, 162, 130, 126, 140, 69, 116, 78, 70, 39, 44, 38, 50, 63, 72, 63, 49, 54, 49, 50, 45, 41, 38, 41, 28, 23, 23, 83, 79, 44, 31, 27, 36, 47, 48, 98, 139, 168], [231, 218, 221, 231, 234, 231, 231, 231, 206, 170, 214, 85, 126, 103, 136, 153, 155, 140, 117, 81, 122, 101, 122, 162, 163, 178, 156, 157, 152, 89, 90, 53, 51, 44, 40, 39, 51, 61, 64, 56, 53, 49, 45, 43, 42, 41, 43, 35, 26, 22, 22, 35, 35, 86, 31, 80, 62, 46, 43, 130, 205, 203], [229, 222, 230, 229, 228, 229, 232, 225, 198, 170, 201, 97, 120, 145, 134, 175, 152, 148, 128, 112, 146, 144, 134, 117, 95, 123, 120, 94, 97, 66, 53, 49, 41, 42, 42, 43, 50, 55, 58, 53, 51, 48, 45, 44, 42, 40, 39, 32, 22, 21, 17, 19, 29, 35, 52, 66, 71, 128, 111, 148, 204, 189], [219, 223, 230, 229, 235, 227, 227, 225, 198, 181, 139, 126, 91, 139, 163, 146, 156, 147, 122, 125, 149, 161, 157, 138, 115, 92, 80, 83, 75, 78, 53, 45, 37, 39, 45, 46, 50, 51, 54, 51, 50, 47, 41, 40, 39, 41, 41, 39, 26, 17, 24, 21, 53, 42, 25, 69, 82, 146, 129, 139, 203, 209], [221, 226, 222, 228, 229, 224, 232, 202, 219, 140, 181, 148, 101, 187, 175, 104, 155, 148, 136, 132, 154, 162, 145, 117, 103, 100, 91, 87, 67, 52, 49, 45, 45, 44, 47, 47, 49, 48, 49, 46, 48, 45, 43, 43, 41, 39, 34, 30, 26, 30, 27, 31, 40, 46, 40, 73, 56, 109, 129, 133, 205, 205], [226, 218, 225, 217, 208, 202, 184, 203, 214, 216, 219, 107, 135, 212, 141, 114, 98, 163, 140, 134, 147, 161, 157, 134, 97, 91, 72, 61, 62, 52, 59, 54, 51, 48, 47, 46, 49, 49, 50, 46, 42, 40, 35, 36, 34, 38, 37, 39, 23, 35, 30, 45, 45, 26, 46, 51, 70, 74, 142, 144, 181, 186], [191, 190, 191, 197, 188, 191, 189, 191, 191, 191, 191, 96, 199, 164, 119, 113, 94, 136, 146, 144, 150, 157, 152, 126, 118, 86, 78, 79, 71, 67, 58, 51, 52, 51, 50, 46, 48, 48, 49, 45, 38, 40, 37, 40, 36, 38, 31, 34, 33, 33, 33, 29, 56, 60, 95, 115, 90, 41, 90, 173, 210, 209], [215, 220, 218, 228, 226, 221, 221, 231, 227, 215, 208, 103, 200, 160, 124, 101, 106, 81, 153, 145, 151, 154, 148, 125, 111, 98, 99, 81, 74, 63, 62, 61, 59, 58, 56, 48, 45, 44, 44, 38, 38, 39, 35, 37, 35, 40, 36, 46, 32, 30, 43, 29, 83, 112, 69, 151, 103, 102, 86, 162, 222, 217], [223, 226, 224, 225, 226, 227, 228, 228, 229, 215, 174, 140, 141, 113, 113, 105, 83, 121, 130, 149, 150, 160, 147, 142, 125, 123, 100, 99, 83, 76, 73, 61, 60, 58, 53, 45, 44, 44, 44, 37, 37, 39, 37, 38, 35, 40, 35, 44, 56, 63, 35, 35, 79, 118, 54, 99, 76, 107, 133, 150, 216, 218], [227, 225, 225, 230, 230, 228, 229, 233, 228, 231, 198, 203, 160, 151, 134, 89, 106, 139, 117, 143, 156, 162, 151, 144, 139, 130, 116, 101, 87, 77, 71, 68, 66, 57, 49, 46, 44, 39, 34, 40, 36, 35, 40, 35, 34, 38, 37, 38, 48, 54, 53, 29, 108, 103, 69, 84, 94, 139, 169, 144, 223, 218], [229, 227, 227, 229, 228, 227, 226, 229, 229, 225, 215, 154, 146, 182, 153, 88, 91, 128, 139, 155, 198, 158, 156, 153, 145, 131, 113, 101, 88, 78, 72, 66, 63, 56, 47, 42, 42, 40, 36, 40, 37, 35, 39, 36, 35, 39, 37, 40, 42, 81, 69, 98, 116, 61, 92, 89, 116, 171, 155, 150, 217, 220], [231, 230, 228, 226, 225, 225, 225, 225, 229, 224, 211, 158, 188, 185, 199, 117, 109, 114, 159, 149, 195, 184, 158, 152, 139, 125, 105, 93, 85, 80, 76, 63, 52, 48, 42, 39, 41, 41, 37, 39, 37, 34, 39, 38, 37, 39, 37, 41, 44, 34, 130, 102, 55, 46, 147, 84, 168, 183, 171, 163, 216, 212], [232, 231, 228, 225, 225, 226, 227, 226, 228, 222, 203, 209, 195, 192, 185, 136, 141, 130, 120, 129, 183, 216, 161, 143, 133, 118, 98, 86, 79, 78, 73, 55, 42, 42, 42, 40, 43, 42, 39, 38, 39, 36, 38, 39, 38, 37, 35, 40, 51, 99, 58, 104, 39, 87, 80, 155, 162, 158, 170, 147, 212, 199], [231, 231, 229, 225, 224, 227, 228, 228, 229, 223, 201, 221, 217, 220, 214, 129, 153, 129, 148, 147, 136, 216, 162, 141, 118, 97, 81, 74, 69, 70, 67, 57, 42, 46, 47, 45, 46, 44, 41, 39, 39, 39, 39, 39, 39, 36, 35, 40, 50, 61, 94, 113, 55, 86, 142, 136, 185, 185, 181, 154, 202, 213], [231, 231, 229, 225, 224, 226, 228, 228, 228, 225, 215, 225, 225, 224, 227, 127, 154, 161, 144, 154, 159, 180, 150, 153, 123, 88, 72, 65, 56, 52, 48, 48, 49, 55, 52, 49, 46, 42, 41, 40, 39, 41, 40, 40, 40, 37, 36, 42, 53, 93, 68, 57, 55, 173, 143, 153, 195, 189, 173, 148, 176, 220]], [[232, 226, 233, 232, 229, 235, 230, 210, 188, 130, 106, 88, 76, 65, 59, 58, 53, 48, 45, 42, 42, 32, 27, 24, 31, 41, 50, 52, 41, 40, 33, 36, 33, 29, 26, 23, 22, 22, 21, 19, 21, 22, 23, 22, 21, 21, 20, 20, 21, 16, 26, 24, 38, 45, 66, 76, 103, 141, 221, 199, 199, 185], [226, 232, 233, 229, 231, 232, 217, 199, 149, 97, 83, 62, 53, 73, 59, 60, 51, 47, 41, 37, 35, 32, 26, 28, 36, 42, 52, 49, 42, 35, 31, 30, 28, 27, 25, 22, 21, 21, 21, 21, 21, 22, 22, 21, 21, 20, 19, 19, 17, 16, 25, 26, 30, 36, 52, 70, 94, 163, 214, 202, 195, 186], [229, 228, 233, 234, 223, 219, 192, 133, 97, 77, 62, 68, 71, 69, 56, 48, 49, 44, 37, 31, 25, 26, 20, 26, 41, 44, 56, 38, 42, 31, 33, 25, 24, 23, 21, 19, 18, 18, 20, 21, 20, 21, 21, 20, 20, 21, 20, 20, 17, 18, 21, 26, 24, 30, 43, 69, 105, 180, 211, 197, 192, 187], [232, 230, 226, 226, 216, 166, 144, 86, 71, 78, 72, 67, 68, 57, 55, 51, 41, 34, 33, 28, 24, 26, 23, 35, 49, 41, 34, 41, 31, 25, 18, 27, 22, 21, 20, 19, 18, 18, 19, 20, 22, 22, 21, 20, 20, 20, 19, 19, 17, 18, 17, 23, 22, 28, 34, 55, 160, 191, 209, 190, 197, 186], [228, 227, 233, 219, 180, 162, 110, 79, 71, 71, 68, 67, 57, 42, 48, 38, 34, 24, 28, 24, 24, 23, 28, 44, 53, 47, 38, 32, 30, 27, 26, 23, 21, 20, 19, 19, 19, 19, 18, 18, 23, 22, 21, 19, 18, 18, 18, 18, 15, 16, 18, 21, 24, 23, 24, 36, 109, 142, 145, 143, 150, 188], [231, 232, 230, 198, 169, 112, 77, 64, 64, 69, 53, 60, 62, 44, 29, 31, 30, 21, 24, 20, 23, 21, 31, 49, 49, 41, 30, 33, 28, 26, 22, 22, 19, 17, 16, 18, 19, 18, 17, 17, 20, 20, 19, 18, 19, 20, 20, 20, 17, 17, 20, 18, 22, 21, 24, 30, 49, 62, 80, 92, 159, 183], [229, 227, 231, 186, 144, 85, 71, 69, 65, 55, 66, 57, 37, 48, 44, 40, 28, 23, 22, 21, 26, 30, 44, 56, 45, 43, 39, 30, 33, 28, 29, 20, 18, 14, 14, 15, 16, 15, 15, 16, 18, 18, 19, 20, 21, 22, 23, 21, 20, 17, 21, 18, 21, 21, 24, 28, 34, 53, 77, 81, 144, 181], [232, 229, 225, 182, 159, 83, 54, 70, 62, 66, 65, 57, 50, 41, 41, 31, 28, 27, 22, 24, 26, 36, 47, 56, 53, 47, 38, 39, 34, 26, 24, 22, 19, 16, 15, 16, 16, 15, 16, 18, 21, 21, 22, 22, 23, 22, 21, 18, 19, 14, 19, 21, 22, 21, 19, 19, 30, 34, 39, 52, 98, 183], [233, 232, 223, 194, 118, 61, 65, 65, 62, 58, 59, 54, 47, 42, 39, 38, 32, 25, 27, 25, 36, 39, 55, 63, 57, 47, 43, 39, 30, 34, 23, 22, 22, 17, 16, 18, 18, 17, 17, 17, 17, 21, 24, 24, 24, 22, 20, 20, 19, 18, 21, 19, 20, 17, 20, 20, 22, 26, 37, 54, 66, 175], [230, 234, 226, 181, 131, 81, 65, 57, 64, 63, 56, 55, 51, 38, 41, 34, 29, 31, 31, 38, 39, 51, 61, 74, 61, 54, 49, 42, 33, 37, 26, 24, 21, 18, 18, 18, 16, 16, 17, 18, 19, 20, 21, 20, 21, 21, 20, 21, 21, 18, 21, 19, 19, 16, 19, 19, 20, 23, 37, 51, 84, 156], [232, 229, 222, 171, 97, 76, 67, 75, 59, 56, 58, 48, 46, 37, 38, 38, 30, 34, 43, 52, 64, 77, 86, 93, 78, 58, 59, 57, 43, 43, 39, 28, 22, 19, 19, 19, 17, 18, 20, 21, 25, 25, 21, 18, 18, 18, 17, 16, 21, 20, 21, 18, 18, 15, 16, 16, 23, 17, 34, 58, 94, 124], [230, 227, 233, 150, 95, 72, 73, 64, 68, 62, 63, 48, 43, 40, 34, 39, 38, 45, 62, 81, 101, 113, 115, 110, 97, 70, 71, 76, 64, 59, 55, 41, 31, 23, 21, 20, 20, 21, 21, 18, 20, 21, 19, 17, 17, 17, 17, 18, 21, 21, 22, 17, 17, 14, 16, 15, 16, 22, 31, 41, 65, 120], [204, 201, 202, 123, 128, 83, 75, 69, 65, 61, 48, 45, 42, 40, 38, 37, 49, 70, 89, 115, 126, 138, 130, 124, 110, 96, 83, 81, 83, 76, 63, 53, 39, 29, 24, 21, 21, 21, 19, 16, 16, 18, 18, 16, 16, 16, 17, 19, 21, 21, 21, 16, 14, 11, 16, 16, 21, 20, 24, 43, 42, 72], [227, 231, 224, 142, 107, 78, 82, 69, 70, 62, 50, 45, 39, 41, 32, 42, 72, 102, 130, 146, 150, 153, 149, 145, 134, 126, 108, 97, 97, 95, 78, 64, 43, 31, 26, 24, 19, 18, 18, 18, 17, 19, 18, 15, 15, 15, 17, 19, 20, 21, 21, 15, 13, 12, 17, 17, 19, 24, 26, 40, 41, 56], [229, 230, 194, 112, 105, 82, 71, 67, 64, 47, 45, 38, 35, 38, 33, 63, 95, 124, 156, 159, 164, 157, 160, 154, 145, 141, 127, 116, 103, 102, 90, 71, 55, 40, 32, 28, 22, 19, 18, 20, 15, 17, 17, 15, 16, 17, 19, 21, 19, 20, 21, 15, 13, 12, 15, 17, 15, 23, 26, 30, 37, 52], [202, 215, 182, 99, 95, 85, 78, 74, 65, 48, 35, 36, 39, 36, 48, 82, 118, 145, 166, 173, 171, 169, 165, 157, 149, 152, 142, 135, 121, 112, 99, 93, 75, 56, 43, 37, 31, 24, 20, 18, 19, 20, 19, 17, 17, 17, 15, 16, 17, 19, 20, 15, 13, 12, 16, 17, 16, 20, 22, 27, 31, 43], [157, 156, 194, 100, 106, 91, 84, 60, 48, 32, 35, 33, 39, 43, 55, 92, 132, 161, 171, 178, 175, 170, 166, 162, 158, 153, 143, 141, 131, 116, 106, 92, 89, 79, 63, 52, 44, 37, 29, 20, 22, 22, 15, 15, 15, 13, 18, 17, 16, 19, 19, 16, 15, 15, 16, 14, 16, 18, 19, 20, 23, 29], [214, 214, 235, 115, 100, 96, 67, 49, 37, 34, 29, 33, 43, 55, 56, 117, 147, 170, 174, 178, 174, 169, 165, 160, 156, 155, 152, 142, 129, 112, 105, 100, 93, 91, 80, 75, 71, 63, 52, 36, 20, 19, 17, 16, 15, 14, 15, 16, 17, 18, 18, 16, 14, 14, 14, 12, 17, 18, 19, 20, 24, 30], [174, 213, 227, 96, 93, 76, 58, 37, 38, 30, 26, 33, 37, 58, 65, 131, 159, 174, 175, 176, 172, 168, 162, 157, 156, 149, 146, 139, 128, 119, 107, 101, 96, 85, 77, 83, 84, 69, 64, 61, 37, 27, 21, 17, 16, 17, 14, 16, 18, 18, 18, 17, 16, 15, 14, 13, 16, 16, 16, 17, 24, 30], [228, 206, 162, 99, 91, 77, 50, 42, 35, 30, 36, 38, 36, 67, 96, 154, 168, 177, 177, 178, 175, 170, 163, 157, 152, 149, 147, 143, 129, 124, 111, 109, 101, 98, 94, 86, 81, 73, 66, 57, 52, 37, 28, 19, 18, 19, 16, 16, 19, 17, 17, 17, 17, 16, 16, 16, 19, 19, 18, 19, 24, 30], [223, 226, 217, 89, 81, 64, 54, 44, 37, 32, 32, 37, 46, 95, 132, 166, 177, 181, 181, 180, 177, 170, 163, 157, 153, 150, 151, 143, 132, 128, 116, 113, 106, 100, 94, 86, 84, 75, 69, 59, 51, 41, 35, 25, 19, 17, 14, 19, 17, 16, 15, 16, 16, 16, 16, 17, 17, 17, 17, 17, 19, 21], [229, 219, 220, 106, 63, 59, 48, 42, 34, 34, 37, 38, 42, 107, 158, 178, 190, 187, 185, 180, 174, 168, 163, 158, 156, 149, 150, 138, 139, 128, 124, 114, 104, 96, 88, 78, 82, 78, 74, 59, 54, 47, 40, 30, 21, 17, 15, 16, 15, 15, 15, 15, 15, 15, 16, 17, 16, 18, 20, 21, 21, 20], [227, 216, 211, 103, 74, 56, 54, 43, 38, 31, 36, 37, 64, 136, 180, 186, 193, 187, 184, 176, 173, 167, 164, 161, 152, 149, 148, 140, 135, 127, 124, 113, 103, 77, 56, 47, 49, 43, 50, 54, 51, 48, 40, 32, 25, 19, 17, 14, 14, 15, 16, 15, 15, 17, 17, 17, 14, 16, 18, 19, 20, 19], [227, 227, 220, 135, 73, 62, 46, 44, 37, 34, 39, 36, 100, 161, 182, 187, 185, 177, 175, 169, 169, 163, 161, 158, 151, 144, 129, 132, 126, 126, 110, 94, 54, 48, 42, 32, 38, 36, 41, 34, 34, 42, 41, 38, 31, 23, 21, 16, 12, 15, 17, 16, 16, 17, 18, 17, 19, 19, 19, 19, 20, 21], [228, 226, 222, 147, 81, 57, 48, 41, 35, 38, 40, 43, 114, 170, 163, 102, 106, 108, 115, 144, 151, 154, 157, 156, 151, 142, 127, 123, 113, 96, 66, 43, 36, 40, 35, 59, 67, 66, 64, 54, 46, 40, 41, 38, 38, 28, 23, 19, 14, 15, 15, 17, 19, 17, 15, 17, 17, 18, 19, 18, 18, 19], [226, 227, 229, 184, 112, 54, 50, 39, 37, 35, 39, 35, 129, 143, 107, 100, 67, 65, 62, 64, 85, 129, 136, 146, 138, 136, 126, 112, 92, 56, 38, 38, 33, 47, 56, 57, 63, 61, 54, 55, 54, 49, 45, 44, 38, 34, 25, 19, 15, 16, 14, 15, 16, 16, 16, 18, 16, 18, 19, 18, 17, 17], [229, 233, 224, 191, 83, 107, 51, 48, 37, 32, 37, 39, 101, 90, 110, 116, 112, 90, 64, 53, 56, 76, 131, 142, 140, 133, 121, 101, 70, 45, 47, 47, 49, 39, 41, 37, 29, 36, 42, 50, 54, 54, 51, 48, 39, 38, 29, 23, 17, 17, 19, 20, 19, 18, 16, 17, 16, 18, 19, 18, 17, 18], [227, 228, 233, 208, 87, 111, 58, 53, 41, 41, 37, 34, 87, 154, 167, 148, 124, 102, 84, 76, 78, 90, 123, 147, 144, 138, 113, 90, 63, 50, 50, 46, 48, 25, 36, 25, 25, 34, 32, 43, 51, 56, 59, 54, 43, 39, 34, 26, 21, 21, 22, 23, 21, 19, 17, 17, 16, 17, 19, 19, 20, 21], [230, 227, 222, 215, 117, 122, 65, 47, 77, 44, 47, 39, 109, 170, 153, 111, 76, 66, 49, 43, 50, 66, 95, 142, 163, 137, 116, 89, 53, 43, 58, 42, 59, 76, 32, 24, 40, 57, 41, 39, 57, 63, 67, 56, 46, 38, 34, 25, 25, 23, 23, 22, 18, 18, 20, 20, 18, 18, 19, 21, 22, 22], [235, 233, 225, 205, 166, 96, 98, 51, 46, 49, 53, 48, 127, 177, 142, 67, 31, 60, 44, 64, 39, 45, 79, 112, 180, 151, 114, 75, 56, 47, 63, 49, 97, 109, 35, 40, 58, 55, 43, 61, 70, 70, 68, 57, 49, 42, 37, 27, 24, 23, 24, 24, 20, 21, 22, 19, 19, 18, 19, 20, 20, 19], [230, 222, 227, 204, 196, 126, 54, 68, 59, 55, 66, 54, 130, 175, 145, 54, 114, 142, 62, 39, 46, 78, 70, 116, 183, 153, 107, 76, 57, 55, 69, 55, 91, 92, 85, 58, 67, 62, 65, 78, 80, 76, 69, 59, 50, 44, 39, 32, 23, 23, 28, 29, 24, 24, 23, 17, 18, 18, 19, 20, 19, 17], [234, 236, 228, 210, 208, 150, 103, 58, 83, 85, 60, 69, 146, 190, 183, 171, 103, 100, 102, 59, 59, 73, 106, 139, 181, 157, 100, 81, 61, 59, 71, 93, 90, 87, 82, 85, 75, 68, 88, 93, 90, 84, 74, 65, 53, 47, 39, 37, 27, 24, 28, 29, 24, 24, 24, 18, 17, 18, 20, 21, 20, 16], [214, 211, 217, 192, 186, 199, 74, 121, 87, 103, 83, 69, 156, 191, 184, 176, 156, 125, 105, 97, 87, 101, 134, 152, 186, 152, 104, 85, 67, 65, 74, 91, 105, 97, 103, 96, 101, 108, 109, 104, 94, 86, 75, 66, 58, 48, 40, 37, 32, 23, 26, 26, 29, 31, 20, 16, 18, 22, 21, 29, 25, 29], [231, 229, 225, 234, 214, 203, 112, 153, 90, 73, 74, 80, 160, 195, 189, 169, 157, 139, 122, 120, 124, 136, 156, 182, 189, 152, 113, 82, 68, 71, 84, 98, 107, 112, 107, 125, 119, 118, 114, 106, 95, 86, 75, 67, 58, 49, 42, 37, 30, 29, 34, 30, 36, 27, 12, 17, 18, 20, 22, 55, 27, 79], [229, 228, 207, 206, 197, 212, 127, 109, 101, 79, 108, 73, 167, 197, 188, 179, 163, 157, 147, 145, 158, 173, 177, 194, 194, 150, 117, 78, 70, 73, 86, 94, 108, 116, 118, 127, 120, 120, 114, 108, 95, 87, 75, 66, 58, 50, 43, 37, 34, 36, 35, 34, 37, 20, 15, 18, 22, 15, 27, 93, 91, 108], [229, 230, 221, 201, 194, 214, 151, 106, 101, 101, 104, 77, 171, 196, 189, 180, 179, 170, 171, 175, 177, 185, 189, 207, 196, 148, 113, 80, 75, 73, 89, 97, 107, 119, 126, 129, 128, 126, 120, 109, 95, 86, 74, 63, 57, 50, 44, 36, 32, 26, 33, 31, 24, 16, 16, 17, 23, 18, 23, 81, 117, 97], [233, 228, 221, 217, 202, 204, 148, 88, 101, 105, 100, 120, 156, 198, 190, 194, 189, 182, 183, 181, 182, 189, 198, 206, 186, 140, 105, 86, 77, 66, 80, 94, 110, 124, 117, 135, 132, 121, 116, 102, 94, 84, 71, 61, 55, 49, 42, 37, 32, 25, 37, 32, 20, 24, 17, 24, 38, 31, 28, 100, 164, 186], [229, 223, 220, 216, 225, 183, 203, 94, 122, 108, 100, 86, 178, 209, 201, 202, 192, 191, 186, 182, 181, 179, 196, 194, 165, 125, 90, 87, 79, 68, 67, 72, 97, 115, 121, 129, 128, 118, 113, 103, 91, 81, 69, 60, 53, 49, 43, 39, 29, 31, 20, 23, 19, 20, 18, 20, 28, 21, 56, 108, 181, 197], [228, 224, 228, 224, 216, 234, 162, 113, 150, 120, 98, 124, 209, 209, 198, 191, 193, 189, 187, 182, 166, 153, 200, 201, 160, 122, 86, 84, 82, 83, 70, 65, 63, 86, 113, 114, 118, 116, 105, 99, 88, 77, 67, 60, 54, 49, 44, 41, 35, 35, 17, 24, 21, 17, 23, 20, 39, 48, 88, 151, 186, 206], [229, 226, 225, 227, 228, 225, 224, 142, 101, 127, 93, 88, 164, 203, 193, 190, 184, 181, 175, 154, 138, 155, 227, 200, 176, 138, 96, 79, 76, 90, 73, 67, 57, 80, 90, 109, 109, 108, 97, 94, 83, 72, 62, 59, 53, 49, 45, 41, 36, 25, 34, 32, 17, 16, 18, 23, 36, 46, 105, 183, 188, 170], [228, 226, 221, 230, 228, 223, 229, 173, 119, 132, 112, 80, 155, 195, 181, 180, 176, 168, 148, 129, 114, 210, 208, 186, 163, 122, 85, 79, 81, 69, 71, 56, 62, 70, 89, 104, 97, 95, 92, 83, 77, 70, 55, 55, 55, 52, 46, 42, 38, 19, 17, 13, 12, 15, 20, 25, 39, 33, 77, 146, 185, 129], [230, 224, 230, 224, 227, 227, 216, 206, 180, 92, 166, 92, 112, 200, 176, 172, 162, 155, 133, 115, 113, 177, 166, 157, 124, 100, 75, 70, 52, 47, 55, 48, 51, 68, 74, 86, 100, 96, 85, 78, 73, 71, 63, 64, 58, 52, 48, 44, 44, 12, 19, 14, 14, 17, 24, 24, 42, 60, 116, 154, 146, 173], [230, 226, 227, 227, 230, 225, 212, 222, 139, 108, 157, 140, 90, 191, 171, 170, 171, 144, 137, 127, 126, 149, 166, 148, 120, 100, 70, 58, 56, 59, 49, 57, 59, 64, 70, 81, 93, 93, 81, 70, 72, 69, 63, 64, 57, 48, 47, 44, 44, 17, 19, 16, 18, 13, 15, 20, 37, 44, 104, 133, 162, 113], [231, 232, 228, 229, 217, 211, 225, 236, 158, 173, 131, 189, 114, 199, 172, 168, 159, 155, 148, 124, 145, 169, 176, 176, 143, 113, 76, 68, 58, 54, 64, 62, 69, 65, 67, 69, 81, 99, 83, 69, 78, 70, 66, 68, 60, 52, 50, 45, 41, 24, 16, 17, 18, 13, 18, 27, 27, 41, 43, 68, 122, 141], [232, 227, 227, 225, 223, 225, 231, 230, 190, 203, 92, 199, 156, 166, 182, 175, 165, 173, 148, 124, 177, 181, 192, 179, 174, 139, 126, 108, 86, 83, 74, 74, 65, 51, 54, 56, 47, 73, 84, 66, 73, 67, 64, 68, 60, 51, 47, 42, 34, 20, 24, 19, 15, 16, 22, 19, 28, 35, 51, 65, 94, 124], [230, 232, 227, 217, 220, 226, 233, 237, 206, 182, 121, 144, 146, 128, 190, 179, 175, 180, 139, 136, 160, 181, 167, 153, 147, 136, 120, 109, 90, 75, 70, 59, 46, 51, 38, 32, 41, 74, 96, 77, 74, 72, 68, 68, 58, 52, 50, 49, 31, 23, 38, 23, 22, 21, 25, 26, 29, 31, 39, 36, 84, 126], [229, 232, 216, 219, 228, 230, 231, 230, 219, 177, 166, 127, 184, 114, 201, 181, 176, 181, 137, 94, 59, 55, 122, 110, 112, 108, 100, 94, 84, 59, 91, 69, 90, 53, 39, 52, 71, 82, 96, 84, 72, 72, 66, 63, 54, 49, 48, 51, 28, 23, 27, 36, 40, 25, 26, 38, 34, 30, 46, 49, 81, 160], [232, 227, 214, 221, 225, 230, 229, 235, 216, 158, 215, 131, 149, 126, 187, 181, 186, 183, 146, 98, 115, 73, 168, 186, 190, 202, 168, 163, 173, 97, 143, 100, 89, 57, 63, 58, 73, 87, 96, 85, 72, 73, 67, 64, 57, 51, 47, 47, 30, 23, 23, 85, 81, 48, 35, 32, 41, 55, 55, 105, 144, 173], [231, 217, 217, 225, 229, 226, 228, 231, 211, 181, 228, 105, 150, 132, 167, 188, 196, 183, 163, 128, 170, 147, 164, 202, 201, 214, 190, 190, 182, 119, 118, 80, 72, 63, 59, 59, 71, 84, 87, 79, 76, 70, 64, 59, 54, 50, 49, 37, 26, 22, 22, 36, 39, 91, 36, 85, 67, 51, 46, 133, 206, 204], [229, 220, 226, 224, 223, 224, 231, 225, 202, 180, 215, 115, 144, 171, 161, 206, 190, 191, 171, 155, 189, 187, 178, 159, 138, 163, 158, 131, 134, 100, 88, 80, 65, 61, 63, 63, 70, 75, 78, 73, 74, 69, 63, 60, 54, 49, 44, 32, 22, 19, 18, 23, 34, 40, 60, 74, 79, 133, 114, 149, 203, 188], [221, 223, 230, 229, 234, 226, 230, 230, 207, 191, 153, 142, 108, 157, 181, 170, 190, 188, 160, 163, 190, 204, 203, 188, 168, 147, 133, 134, 124, 123, 97, 83, 62, 60, 64, 65, 69, 70, 73, 70, 71, 66, 56, 54, 49, 47, 46, 39, 26, 15, 25, 25, 58, 50, 35, 77, 89, 151, 132, 139, 202, 208], [223, 228, 223, 229, 230, 228, 237, 210, 228, 151, 194, 162, 117, 202, 191, 124, 187, 184, 170, 166, 191, 203, 191, 167, 158, 159, 150, 145, 121, 100, 93, 83, 73, 65, 66, 66, 68, 67, 68, 63, 65, 63, 57, 55, 51, 45, 38, 30, 26, 30, 28, 35, 48, 56, 50, 82, 65, 114, 132, 133, 204, 204], [230, 222, 229, 221, 212, 206, 189, 208, 222, 225, 229, 119, 148, 227, 157, 134, 125, 194, 170, 164, 178, 196, 196, 178, 145, 144, 125, 112, 110, 93, 97, 85, 76, 68, 66, 65, 66, 66, 67, 61, 57, 54, 49, 46, 43, 44, 41, 39, 23, 34, 31, 48, 53, 35, 57, 62, 79, 81, 147, 144, 180, 185], [195, 194, 195, 198, 189, 192, 193, 195, 196, 198, 200, 108, 215, 181, 140, 137, 124, 167, 178, 174, 181, 189, 189, 165, 161, 132, 125, 123, 114, 106, 93, 80, 77, 71, 69, 65, 65, 63, 64, 59, 52, 51, 49, 50, 45, 44, 35, 35, 32, 32, 36, 34, 65, 71, 108, 128, 101, 48, 95, 176, 209, 208], [216, 221, 219, 227, 224, 219, 219, 230, 228, 218, 217, 115, 219, 183, 151, 132, 142, 117, 189, 181, 186, 189, 185, 162, 150, 137, 138, 120, 112, 100, 99, 94, 84, 78, 75, 65, 60, 57, 57, 49, 49, 49, 45, 46, 41, 46, 40, 47, 31, 29, 46, 36, 94, 125, 82, 164, 113, 111, 93, 165, 221, 214], [222, 225, 223, 223, 221, 222, 223, 223, 227, 216, 181, 153, 161, 139, 144, 140, 119, 159, 167, 186, 187, 197, 184, 179, 163, 161, 138, 138, 123, 114, 113, 95, 87, 78, 72, 62, 59, 55, 55, 47, 47, 49, 46, 47, 41, 46, 39, 48, 57, 63, 40, 42, 90, 131, 69, 112, 89, 116, 140, 153, 215, 215], [225, 223, 223, 225, 225, 222, 223, 228, 226, 232, 205, 216, 180, 177, 166, 122, 141, 174, 150, 176, 189, 198, 188, 183, 180, 173, 159, 147, 133, 121, 118, 106, 93, 77, 68, 60, 57, 50, 45, 50, 46, 43, 49, 44, 40, 44, 41, 42, 51, 57, 60, 38, 121, 118, 84, 97, 107, 148, 176, 147, 222, 215], [224, 222, 222, 224, 223, 222, 222, 227, 227, 226, 220, 164, 163, 204, 179, 117, 120, 155, 166, 183, 226, 187, 189, 190, 186, 176, 160, 148, 135, 124, 116, 104, 90, 74, 66, 57, 55, 51, 46, 50, 45, 43, 48, 45, 41, 45, 43, 44, 45, 85, 78, 108, 129, 76, 106, 102, 126, 180, 162, 153, 216, 217], [225, 225, 223, 224, 225, 225, 227, 227, 230, 225, 214, 165, 198, 199, 217, 136, 128, 133, 176, 166, 212, 203, 184, 183, 177, 170, 153, 142, 131, 119, 112, 93, 77, 67, 61, 54, 54, 52, 47, 49, 47, 44, 47, 46, 45, 44, 42, 46, 49, 41, 139, 112, 68, 60, 161, 97, 178, 190, 175, 166, 215, 211], [226, 226, 226, 225, 226, 230, 231, 230, 229, 223, 204, 212, 199, 200, 194, 148, 157, 146, 133, 141, 195, 232, 182, 172, 171, 163, 147, 133, 122, 114, 102, 79, 65, 61, 59, 55, 56, 53, 50, 48, 49, 46, 48, 47, 46, 45, 40, 45, 58, 108, 68, 117, 53, 101, 94, 168, 172, 165, 174, 147, 211, 198], [225, 227, 227, 225, 228, 233, 234, 232, 231, 223, 200, 220, 217, 224, 220, 139, 169, 147, 162, 161, 148, 232, 184, 170, 155, 140, 128, 119, 108, 103, 95, 79, 62, 65, 64, 60, 59, 55, 52, 50, 50, 50, 50, 49, 49, 44, 40, 48, 59, 72, 104, 126, 69, 100, 154, 146, 193, 189, 184, 154, 201, 212], [225, 227, 227, 226, 228, 232, 234, 232, 230, 225, 213, 222, 225, 224, 231, 135, 170, 179, 160, 168, 171, 196, 172, 182, 160, 131, 117, 108, 95, 84, 74, 68, 69, 72, 69, 64, 59, 55, 52, 51, 50, 52, 51, 51, 50, 45, 44, 50, 62, 104, 81, 70, 69, 187, 155, 163, 203, 193, 176, 148, 175, 219]]]]}\n"
          ]
        }
      ],
      "source": "import cv2\nimport numpy as np\nimport json\n\n\ndef getJpeg(path, size):\n\n    img \u003d cv2.imread(path, cv2.IMREAD_COLOR)\n    # retrived array has BGR format and 0-255 normalization\n    img \u003d cv2.resize(img, (size, size))\n    img \u003d img.transpose(2,0,1).reshape(1,3,size,size)\n    print(path, img.shape, \"; data range:\",np.amin(img),\":\",np.amax(img))\n    return img\n\nmy_image \u003d getJpeg(\u0027age-gender-recognition-retail-0001.jpg\u0027,62)\n\n\ndata_obj \u003d {\u0027inputs\u0027:  my_image.tolist()}\ndata_json \u003d json.dumps(data_obj)\nprint(data_json)"
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "### Run the inference request to OVMS REST API endpoint"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": 8,
      "metadata": {
        "pycharm": {}
      },
      "outputs": [
        {
          "name": "stdout",
          "output_type": "stream",
          "text": [
            "{\u0027outputs\u0027: {\u0027age_conv3\u0027: [[[[0.2519038915634155]]]], \u0027prob\u0027: [[[[0.9874807000160217]], [[0.012519358657300472]]]]}}\n"
          ]
        }
      ],
      "source": [
        "import requests\n",
        "\n",
        "\n",
        "result \u003d requests.post(\"http://localhost:8000/v1/models/age_gender:predict\", data\u003ddata_json)\n",
        "result_dict \u003d json.loads(result.text)\n",
        "print(result_dict)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {
        "pycharm": {}
      },
      "source": [
        "Outputs\n",
        "name: \"age_conv3\", shape: [1, 1, 1, 1] - Estimated age divided by 100.\n",
        "name: \"prob\", shape: [1, 2, 1, 1] - Softmax output across 2 type classes [female, male]"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.0"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 2
}
